package fr.andromede.objects;

import java.util.ArrayList;
import java.util.List;

import fr.andromede.constantes.Strategy;

public class ObjectToInsert {

    private Class<?>            initialClasse;
    private String stringClassName;

    private List<FieldToInsert> fields;

    public ObjectToInsert() {
        this.fields = new ArrayList<FieldToInsert>();
    }
    
    /**
     * Utiliser pour les objets List,Map
     * 
     * @param className
     */
    public ObjectToInsert(String className) {
    	this.fields = new ArrayList<FieldToInsert>();
    	initialClasse = null;
    	stringClassName = className;
    }

    public List<FieldToInsert> getFields () {
        return this.fields;
    }

    public void setFields ( final List<FieldToInsert> fields ) {
        this.fields = fields;
    }

    public String getClassName () {
    	if(this.initialClasse == null) {
    		return stringClassName;
    	} else {
    		return this.initialClasse.getSimpleName();
    	}
    }

    /**
     * Getter de initialClasse
     * 
     * @return the initialClasse
     */
    public Class<?> getInitialClasse () {
        return this.initialClasse;
    }

    /**
     * 
     * Setter de initialClasse
     * 
     * @param initialClasse
     *            the initialClasse to set
     */
    public void setInitialClasse ( final Class<?> initialClasse ) {
        this.initialClasse = initialClasse;
    }

    /**
     * 
     * @return
     */
    public boolean isThereAnyIdentifier () {
        for (final FieldToInsert f : this.fields) {
            if (f.isId()) {
                return true;
            }
        }

        return false;
    }

    /**
     * Renvoie le champ autoinc qui correpond.
     * 
     * @return
     */
    public String autoIncField () {
        for (final FieldToInsert f : this.fields) {
            if (f.isId() && f.getStrategy() == Strategy.AUTO) {
                return f.getName();
            }
        }
        return "rowid";
    }

    /**
     * Renvoie le champ autoinc qui correpond.
     * 
     * @return
     */
    public boolean isAutoInc () {
        for (final FieldToInsert f : this.fields) {
            if (f.isId() && f.getStrategy() == Strategy.AUTO) {
                return true;
            }
        }
        return false;
    }

    /**
     * vrai si il y a plus d'une PK
     * 
     * @return
     */
    public boolean isMultipleIdentifiers () {
        int i = 0;
        for (final FieldToInsert f : this.fields) {
            if (f.isId()) {
                i++;
                if (i > 1) {
                    return true;
                }
            }
        }
        return false;
    }

    /**
     * Renvoie les pk sous la forme pk1,pk2
     * 
     * @return
     */
    public String stringListIdentifiers () {
        StringBuilder sb = new StringBuilder();
        for (final FieldToInsert f : this.fields) {
            if (f.isId()) {
                sb.append(f.getName()).append(",");
            }
        }
        return sb.substring(0 , sb.length() - 1);
    }

}
